/* perfect-scrollbar v0.6.4 */
(function e (t, n, r) { function s (o, u) { if (!n[o]) { if (!t[o]) { var a = typeof require === 'function' && require; if (!u && a) return a(o, !0); if (i) return i(o, !0); var f = new Error("Cannot find module '" + o + "'"); throw f.code = 'MODULE_NOT_FOUND', f } var l = n[o] = { exports: {} }; t[o][0].call(l.exports, function (e) { var n = t[o][1][e]; return s(n || e) }, l, l.exports, e, t, n, r) } return n[o].exports } var i = typeof require === 'function' && require; for (var o = 0; o < r.length; o++)s(r[o]); return s })({
  1: [function (require, module, exports) {
    /* Copyright (c) 2015 Hyunje Alex Jun and other contributors
 * Licensed under the MIT License
 */
    'use strict'

    var ps = require('../main')
    var psInstances = require('../plugin/instances')

    function mountJQuery (jQuery) {
      jQuery.fn.perfectScrollbar = function (settingOrCommand) {
        return this.each(function () {
          if (typeof settingOrCommand === 'object' ||
          typeof settingOrCommand === 'undefined') {
            // If it's an object or none, initialize.
            var settings = settingOrCommand

            if (!psInstances.get(this)) {
              ps.initialize(this, settings)
            }
          } else {
            // Unless, it may be a command.
            var command = settingOrCommand

            if (command === 'update') {
              ps.update(this)
            } else if (command === 'destroy') {
              ps.destroy(this)
            }
          }

          return jQuery(this)
        })
      }
    }

    if (typeof define === 'function' && define.amd) {
      // AMD. Register as an anonymous module.
      define(['jquery'], mountJQuery)
    } else {
      var jq = window.jQuery ? window.jQuery : window.$
      if (typeof jq !== 'undefined') {
        mountJQuery(jq)
      }
    }

    module.exports = mountJQuery
  }, { '../main': 7, '../plugin/instances': 18 }],
  2: [function (require, module, exports) {
    /* Copyright (c) 2015 Hyunje Alex Jun and other contributors
 * Licensed under the MIT License
 */
    'use strict'

    function oldAdd (element, className) {
      var classes = element.className.split(' ')
      if (classes.indexOf(className) < 0) {
        classes.push(className)
      }
      element.className = classes.join(' ')
    }

    function oldRemove (element, className) {
      var classes = element.className.split(' ')
      var idx = classes.indexOf(className)
      if (idx >= 0) {
        classes.splice(idx, 1)
      }
      element.className = classes.join(' ')
    }

    exports.add = function (element, className) {
      if (element.classList) {
        element.classList.add(className)
      } else {
        oldAdd(element, className)
      }
    }

    exports.remove = function (element, className) {
      if (element.classList) {
        element.classList.remove(className)
      } else {
        oldRemove(element, className)
      }
    }

    exports.list = function (element) {
      if (element.classList) {
        return element.classList
      } else {
        return element.className.split(' ')
      }
    }
  }, {}],
  3: [function (require, module, exports) {
    /* Copyright (c) 2015 Hyunje Alex Jun and other contributors
 * Licensed under the MIT License
 */
    'use strict'

    exports.e = function (tagName, className) {
      var element = document.createElement(tagName)
      element.className = className
      return element
    }

    exports.appendTo = function (child, parent) {
      parent.appendChild(child)
      return child
    }

    function cssGet (element, styleName) {
      return window.getComputedStyle(element)[styleName]
    }

    function cssSet (element, styleName, styleValue) {
      if (typeof styleValue === 'number') {
        styleValue = styleValue.toString() + 'px'
      }
      element.style[styleName] = styleValue
      return element
    }

    function cssMultiSet (element, obj) {
      for (var key in obj) {
        var val = obj[key]
        if (typeof val === 'number') {
          val = val.toString() + 'px'
        }
        element.style[key] = val
      }
      return element
    }

    exports.css = function (element, styleNameOrObject, styleValue) {
      if (typeof styleNameOrObject === 'object') {
        // multiple set with object
        return cssMultiSet(element, styleNameOrObject)
      } else {
        if (typeof styleValue === 'undefined') {
          return cssGet(element, styleNameOrObject)
        } else {
          return cssSet(element, styleNameOrObject, styleValue)
        }
      }
    }

    exports.matches = function (element, query) {
      if (typeof element.matches !== 'undefined') {
        return element.matches(query)
      } else {
        if (typeof element.matchesSelector !== 'undefined') {
          return element.matchesSelector(query)
        } else if (typeof element.webkitMatchesSelector !== 'undefined') {
          return element.webkitMatchesSelector(query)
        } else if (typeof element.mozMatchesSelector !== 'undefined') {
          return element.mozMatchesSelector(query)
        } else if (typeof element.msMatchesSelector !== 'undefined') {
          return element.msMatchesSelector(query)
        }
      }
    }

    exports.remove = function (element) {
      if (typeof element.remove !== 'undefined') {
        element.remove()
      } else {
        if (element.parentNode) {
          element.parentNode.removeChild(element)
        }
      }
    }
  }, {}],
  4: [function (require, module, exports) {
    /* Copyright (c) 2015 Hyunje Alex Jun and other contributors
 * Licensed under the MIT License
 */
    'use strict'

    var EventElement = function (element) {
      this.element = element
      this.events = {}
    }

    EventElement.prototype.bind = function (eventName, handler) {
      if (typeof this.events[eventName] === 'undefined') {
        this.events[eventName] = []
      }
      this.events[eventName].push(handler)
      this.element.addEventListener(eventName, handler, false)
    }

    EventElement.prototype.unbind = function (eventName, handler) {
      var isHandlerProvided = (typeof handler !== 'undefined')
      this.events[eventName] = this.events[eventName].filter(function (hdlr) {
        if (isHandlerProvided && hdlr !== handler) {
          return true
        }
        this.element.removeEventListener(eventName, hdlr, false)
        return false
      }, this)
    }

    EventElement.prototype.unbindAll = function () {
      for (var name in this.events) {
        this.unbind(name)
      }
    }

    var EventManager = function () {
      this.eventElements = []
    }

    EventManager.prototype.eventElement = function (element) {
      var ee = this.eventElements.filter(function (eventElement) {
        return eventElement.element === element
      })[0]
      if (typeof ee === 'undefined') {
        ee = new EventElement(element)
        this.eventElements.push(ee)
      }
      return ee
    }

    EventManager.prototype.bind = function (element, eventName, handler) {
      this.eventElement(element).bind(eventName, handler)
    }

    EventManager.prototype.unbind = function (element, eventName, handler) {
      this.eventElement(element).unbind(eventName, handler)
    }

    EventManager.prototype.unbindAll = function () {
      for (var i = 0; i < this.eventElements.length; i++) {
        this.eventElements[i].unbindAll()
      }
    }

    EventManager.prototype.once = function (element, eventName, handler) {
      var ee = this.eventElement(element)
      var onceHandler = function (e) {
        ee.unbind(eventName, onceHandler)
        handler(e)
      }
      ee.bind(eventName, onceHandler)
    }

    module.exports = EventManager
  }, {}],
  5: [function (require, module, exports) {
    /* Copyright (c) 2015 Hyunje Alex Jun and other contributors
 * Licensed under the MIT License
 */
    'use strict'

    module.exports = (function () {
      function s4 () {
        return Math.floor((1 + Math.random()) * 0x10000)
          .toString(16)
          .substring(1)
      }
      return function () {
        return s4() + s4() + '-' + s4() + '-' + s4() + '-' +
           s4() + '-' + s4() + s4() + s4()
      }
    })()
  }, {}],
  6: [function (require, module, exports) {
    /* Copyright (c) 2015 Hyunje Alex Jun and other contributors
 * Licensed under the MIT License
 */
    'use strict'

    var cls = require('./class')
    var d = require('./dom')

    exports.toInt = function (x) {
      return parseInt(x, 10) || 0
    }

    exports.clone = function (obj) {
      if (obj === null) {
        return null
      } else if (typeof obj === 'object') {
        var result = {}
        for (var key in obj) {
          result[key] = this.clone(obj[key])
        }
        return result
      } else {
        return obj
      }
    }

    exports.extend = function (original, source) {
      var result = this.clone(original)
      for (var key in source) {
        result[key] = this.clone(source[key])
      }
      return result
    }

    exports.isEditable = function (el) {
      return d.matches(el, 'input,[contenteditable]') ||
         d.matches(el, 'select,[contenteditable]') ||
         d.matches(el, 'textarea,[contenteditable]') ||
         d.matches(el, 'button,[contenteditable]')
    }

    exports.removePsClasses = function (element) {
      var clsList = cls.list(element)
      for (var i = 0; i < clsList.length; i++) {
        var className = clsList[i]
        if (className.indexOf('ps-') === 0) {
          cls.remove(element, className)
        }
      }
    }

    exports.outerWidth = function (element) {
      return this.toInt(d.css(element, 'width')) +
         this.toInt(d.css(element, 'paddingLeft')) +
         this.toInt(d.css(element, 'paddingRight')) +
         this.toInt(d.css(element, 'borderLeftWidth')) +
         this.toInt(d.css(element, 'borderRightWidth'))
    }

    exports.startScrolling = function (element, axis) {
      cls.add(element, 'ps-in-scrolling')
      if (typeof axis !== 'undefined') {
        cls.add(element, 'ps-' + axis)
      } else {
        cls.add(element, 'ps-x')
        cls.add(element, 'ps-y')
      }
    }

    exports.stopScrolling = function (element, axis) {
      cls.remove(element, 'ps-in-scrolling')
      if (typeof axis !== 'undefined') {
        cls.remove(element, 'ps-' + axis)
      } else {
        cls.remove(element, 'ps-x')
        cls.remove(element, 'ps-y')
      }
    }

    exports.env = {
      isWebKit: 'WebkitAppearance' in document.documentElement.style,
      supportsTouch: (('ontouchstart' in window) || window.DocumentTouch && document instanceof window.DocumentTouch),
      supportsIePointer: window.navigator.msMaxTouchPoints !== null
    }
  }, { './class': 2, './dom': 3 }],
  7: [function (require, module, exports) {
    /* Copyright (c) 2015 Hyunje Alex Jun and other contributors
 * Licensed under the MIT License
 */
    'use strict'

    var destroy = require('./plugin/destroy')
    var initialize = require('./plugin/initialize')
    var update = require('./plugin/update')

    module.exports = {
      initialize: initialize,
      update: update,
      destroy: destroy
    }
  }, { './plugin/destroy': 9, './plugin/initialize': 17, './plugin/update': 20 }],
  8: [function (require, module, exports) {
    /* Copyright (c) 2015 Hyunje Alex Jun and other contributors
 * Licensed under the MIT License
 */
    'use strict'

    module.exports = {
      wheelSpeed: 1,
      wheelPropagation: false,
      swipePropagation: true,
      minScrollbarLength: null,
      maxScrollbarLength: null,
      useBothWheelAxes: false,
      useKeyboard: true,
      suppressScrollX: false,
      suppressScrollY: false,
      scrollXMarginOffset: 0,
      scrollYMarginOffset: 0,
      stopPropagationOnClick: true
    }
  }, {}],
  9: [function (require, module, exports) {
    /* Copyright (c) 2015 Hyunje Alex Jun and other contributors
 * Licensed under the MIT License
 */
    'use strict'

    var d = require('../lib/dom')
    var h = require('../lib/helper')
    var instances = require('./instances')

    module.exports = function (element) {
      var i = instances.get(element)

      if (!i) {
        return
      }

      i.event.unbindAll()
      d.remove(i.scrollbarX)
      d.remove(i.scrollbarY)
      d.remove(i.scrollbarXRail)
      d.remove(i.scrollbarYRail)
      h.removePsClasses(element)

      instances.remove(element)
    }
  }, { '../lib/dom': 3, '../lib/helper': 6, './instances': 18 }],
  10: [function (require, module, exports) {
    /* Copyright (c) 2015 Hyunje Alex Jun and other contributors
 * Licensed under the MIT License
 */
    'use strict'

    var h = require('../../lib/helper')
    var instances = require('../instances')
    var updateGeometry = require('../update-geometry')

    function bindClickRailHandler (element, i) {
      function pageOffset (el) {
        return el.getBoundingClientRect()
      }
      var stopPropagation = window.Event.prototype.stopPropagation.bind

      if (i.settings.stopPropagationOnClick) {
        i.event.bind(i.scrollbarY, 'click', stopPropagation)
      }
      i.event.bind(i.scrollbarYRail, 'click', function (e) {
        var halfOfScrollbarLength = h.toInt(i.scrollbarYHeight / 2)
        var positionTop = i.railYRatio * (e.pageY - window.scrollY - pageOffset(i.scrollbarYRail).top - halfOfScrollbarLength)
        var maxPositionTop = i.railYRatio * (i.railYHeight - i.scrollbarYHeight)
        var positionRatio = positionTop / maxPositionTop

        if (positionRatio < 0) {
          positionRatio = 0
        } else if (positionRatio > 1) {
          positionRatio = 1
        }

        element.scrollTop = (i.contentHeight - i.containerHeight) * positionRatio
        updateGeometry(element)

        e.stopPropagation()
      })

      if (i.settings.stopPropagationOnClick) {
        i.event.bind(i.scrollbarX, 'click', stopPropagation)
      }
      i.event.bind(i.scrollbarXRail, 'click', function (e) {
        var halfOfScrollbarLength = h.toInt(i.scrollbarXWidth / 2)
        var positionLeft = i.railXRatio * (e.pageX - window.scrollX - pageOffset(i.scrollbarXRail).left - halfOfScrollbarLength)
        var maxPositionLeft = i.railXRatio * (i.railXWidth - i.scrollbarXWidth)
        var positionRatio = positionLeft / maxPositionLeft

        if (positionRatio < 0) {
          positionRatio = 0
        } else if (positionRatio > 1) {
          positionRatio = 1
        }

        element.scrollLeft = ((i.contentWidth - i.containerWidth) * positionRatio) - i.negativeScrollAdjustment
        updateGeometry(element)

        e.stopPropagation()
      })
    }

    module.exports = function (element) {
      var i = instances.get(element)
      bindClickRailHandler(element, i)
    }
  }, { '../../lib/helper': 6, '../instances': 18, '../update-geometry': 19 }],
  11: [function (require, module, exports) {
    /* Copyright (c) 2015 Hyunje Alex Jun and other contributors
 * Licensed under the MIT License
 */
    'use strict'

    var d = require('../../lib/dom')
    var h = require('../../lib/helper')
    var instances = require('../instances')
    var updateGeometry = require('../update-geometry')

    function bindMouseScrollXHandler (element, i) {
      var currentLeft = null
      var currentPageX = null

      function updateScrollLeft (deltaX) {
        var newLeft = currentLeft + (deltaX * i.railXRatio)
        var maxLeft = i.scrollbarXRail.getBoundingClientRect().left + (i.railXRatio * (i.railXWidth - i.scrollbarXWidth))

        if (newLeft < 0) {
          i.scrollbarXLeft = 0
        } else if (newLeft > maxLeft) {
          i.scrollbarXLeft = maxLeft
        } else {
          i.scrollbarXLeft = newLeft
        }

        var scrollLeft = h.toInt(i.scrollbarXLeft * (i.contentWidth - i.containerWidth) / (i.containerWidth - (i.railXRatio * i.scrollbarXWidth))) - i.negativeScrollAdjustment
        element.scrollLeft = scrollLeft
      }

      var mouseMoveHandler = function (e) {
        updateScrollLeft(e.pageX - currentPageX)
        updateGeometry(element)
        e.stopPropagation()
        e.preventDefault()
      }

      var mouseUpHandler = function () {
        h.stopScrolling(element, 'x')
        i.event.unbind(i.ownerDocument, 'mousemove', mouseMoveHandler)
      }

      i.event.bind(i.scrollbarX, 'mousedown', function (e) {
        currentPageX = e.pageX
        currentLeft = h.toInt(d.css(i.scrollbarX, 'left')) * i.railXRatio
        h.startScrolling(element, 'x')

        i.event.bind(i.ownerDocument, 'mousemove', mouseMoveHandler)
        i.event.once(i.ownerDocument, 'mouseup', mouseUpHandler)

        e.stopPropagation()
        e.preventDefault()
      })
    }

    function bindMouseScrollYHandler (element, i) {
      var currentTop = null
      var currentPageY = null

      function updateScrollTop (deltaY) {
        var newTop = currentTop + (deltaY * i.railYRatio)
        var maxTop = i.scrollbarYRail.getBoundingClientRect().top + (i.railYRatio * (i.railYHeight - i.scrollbarYHeight))

        if (newTop < 0) {
          i.scrollbarYTop = 0
        } else if (newTop > maxTop) {
          i.scrollbarYTop = maxTop
        } else {
          i.scrollbarYTop = newTop
        }

        var scrollTop = h.toInt(i.scrollbarYTop * (i.contentHeight - i.containerHeight) / (i.containerHeight - (i.railYRatio * i.scrollbarYHeight)))
        element.scrollTop = scrollTop
      }

      var mouseMoveHandler = function (e) {
        updateScrollTop(e.pageY - currentPageY)
        updateGeometry(element)
        e.stopPropagation()
        e.preventDefault()
      }

      var mouseUpHandler = function () {
        h.stopScrolling(element, 'y')
        i.event.unbind(i.ownerDocument, 'mousemove', mouseMoveHandler)
      }

      i.event.bind(i.scrollbarY, 'mousedown', function (e) {
        currentPageY = e.pageY
        currentTop = h.toInt(d.css(i.scrollbarY, 'top')) * i.railYRatio
        h.startScrolling(element, 'y')

        i.event.bind(i.ownerDocument, 'mousemove', mouseMoveHandler)
        i.event.once(i.ownerDocument, 'mouseup', mouseUpHandler)

        e.stopPropagation()
        e.preventDefault()
      })
    }

    module.exports = function (element) {
      var i = instances.get(element)
      bindMouseScrollXHandler(element, i)
      bindMouseScrollYHandler(element, i)
    }
  }, { '../../lib/dom': 3, '../../lib/helper': 6, '../instances': 18, '../update-geometry': 19 }],
  12: [function (require, module, exports) {
    /* Copyright (c) 2015 Hyunje Alex Jun and other contributors
 * Licensed under the MIT License
 */
    'use strict'

    var h = require('../../lib/helper')
    var instances = require('../instances')
    var updateGeometry = require('../update-geometry')

    function bindKeyboardHandler (element, i) {
      var hovered = false
      i.event.bind(element, 'mouseenter', function () {
        hovered = true
      })
      i.event.bind(element, 'mouseleave', function () {
        hovered = false
      })

      var shouldPrevent = false
      function shouldPreventDefault (deltaX, deltaY) {
        var scrollTop = element.scrollTop
        if (deltaX === 0) {
          if (!i.scrollbarYActive) {
            return false
          }
          if ((scrollTop === 0 && deltaY > 0) || (scrollTop >= i.contentHeight - i.containerHeight && deltaY < 0)) {
            return !i.settings.wheelPropagation
          }
        }

        var scrollLeft = element.scrollLeft
        if (deltaY === 0) {
          if (!i.scrollbarXActive) {
            return false
          }
          if ((scrollLeft === 0 && deltaX < 0) || (scrollLeft >= i.contentWidth - i.containerWidth && deltaX > 0)) {
            return !i.settings.wheelPropagation
          }
        }
        return true
      }

      i.event.bind(i.ownerDocument, 'keydown', function (e) {
        if (e.isDefaultPrevented && e.isDefaultPrevented()) {
          return
        }

        if (!hovered) {
          return
        }

        var activeElement = document.activeElement ? document.activeElement : i.ownerDocument.activeElement
        if (activeElement) {
          // go deeper if element is a webcomponent
          while (activeElement.shadowRoot) {
            activeElement = activeElement.shadowRoot.activeElement
          }
          if (h.isEditable(activeElement)) {
            return
          }
        }

        var deltaX = 0
        var deltaY = 0

        switch (e.which) {
          case 37: // left
            deltaX = -30
            break
          case 38: // up
            deltaY = 30
            break
          case 39: // right
            deltaX = 30
            break
          case 40: // down
            deltaY = -30
            break
          case 33: // page up
            deltaY = 90
            break
          case 32: // space bar
          case 34: // page down
            deltaY = -90
            break
          case 35: // end
            if (e.ctrlKey) {
              deltaY = -i.contentHeight
            } else {
              deltaY = -i.containerHeight
            }
            break
          case 36: // home
            if (e.ctrlKey) {
              deltaY = element.scrollTop
            } else {
              deltaY = i.containerHeight
            }
            break
          default:
            return
        }

        element.scrollTop = element.scrollTop - deltaY
        element.scrollLeft = element.scrollLeft + deltaX
        updateGeometry(element)

        shouldPrevent = shouldPreventDefault(deltaX, deltaY)
        if (shouldPrevent) {
          e.preventDefault()
        }
      })
    }

    module.exports = function (element) {
      var i = instances.get(element)
      bindKeyboardHandler(element, i)
    }
  }, { '../../lib/helper': 6, '../instances': 18, '../update-geometry': 19 }],
  13: [function (require, module, exports) {
    /* Copyright (c) 2015 Hyunje Alex Jun and other contributors
 * Licensed under the MIT License
 */
    'use strict'

    var h = require('../../lib/helper')
    var instances = require('../instances')
    var updateGeometry = require('../update-geometry')

    function bindMouseWheelHandler (element, i) {
      var shouldPrevent = false

      function shouldPreventDefault (deltaX, deltaY) {
        var scrollTop = element.scrollTop
        if (deltaX === 0) {
          if (!i.scrollbarYActive) {
            return false
          }
          if ((scrollTop === 0 && deltaY > 0) || (scrollTop >= i.contentHeight - i.containerHeight && deltaY < 0)) {
            return !i.settings.wheelPropagation
          }
        }

        var scrollLeft = element.scrollLeft
        if (deltaY === 0) {
          if (!i.scrollbarXActive) {
            return false
          }
          if ((scrollLeft === 0 && deltaX < 0) || (scrollLeft >= i.contentWidth - i.containerWidth && deltaX > 0)) {
            return !i.settings.wheelPropagation
          }
        }
        return true
      }

      function getDeltaFromEvent (e) {
        var deltaX = e.deltaX
        var deltaY = -1 * e.deltaY

        if (typeof deltaX === 'undefined' || typeof deltaY === 'undefined') {
          // OS X Safari
          deltaX = -1 * e.wheelDeltaX / 6
          deltaY = e.wheelDeltaY / 6
        }

        if (e.deltaMode && e.deltaMode === 1) {
          // Firefox in deltaMode 1: Line scrolling
          deltaX *= 10
          deltaY *= 10
        }

        if (deltaX !== deltaX && deltaY !== deltaY/* NaN checks */) {
          // IE in some mouse drivers
          deltaX = 0
          deltaY = e.wheelDelta
        }

        return [deltaX, deltaY]
      }

      function shouldBeConsumedByTextarea (deltaX, deltaY) {
        var hoveredTextarea = element.querySelector('textarea:hover')
        if (hoveredTextarea) {
          var maxScrollTop = hoveredTextarea.scrollHeight - hoveredTextarea.clientHeight
          if (maxScrollTop > 0) {
            if (!(hoveredTextarea.scrollTop === 0 && deltaY > 0) &&
            !(hoveredTextarea.scrollTop === maxScrollTop && deltaY < 0)) {
              return true
            }
          }
          var maxScrollLeft = hoveredTextarea.scrollLeft - hoveredTextarea.clientWidth
          if (maxScrollLeft > 0) {
            if (!(hoveredTextarea.scrollLeft === 0 && deltaX < 0) &&
            !(hoveredTextarea.scrollLeft === maxScrollLeft && deltaX > 0)) {
              return true
            }
          }
        }
        return false
      }

      function mousewheelHandler (e) {
        // FIXME: this is a quick fix for the select problem in FF and IE.
        // If there comes an effective way to deal with the problem,
        // this lines should be removed.
        if (!h.env.isWebKit && element.querySelector('select:focus')) {
          return
        }

        var delta = getDeltaFromEvent(e)

        var deltaX = delta[0]
        var deltaY = delta[1]

        if (shouldBeConsumedByTextarea(deltaX, deltaY)) {
          return
        }

        shouldPrevent = false
        if (!i.settings.useBothWheelAxes) {
          // deltaX will only be used for horizontal scrolling and deltaY will
          // only be used for vertical scrolling - this is the default
          element.scrollTop = element.scrollTop - (deltaY * i.settings.wheelSpeed)
          element.scrollLeft = element.scrollLeft + (deltaX * i.settings.wheelSpeed)
        } else if (i.scrollbarYActive && !i.scrollbarXActive) {
          // only vertical scrollbar is active and useBothWheelAxes option is
          // active, so let's scroll vertical bar using both mouse wheel axes
          if (deltaY) {
            element.scrollTop = element.scrollTop - (deltaY * i.settings.wheelSpeed)
          } else {
            element.scrollTop = element.scrollTop + (deltaX * i.settings.wheelSpeed)
          }
          shouldPrevent = true
        } else if (i.scrollbarXActive && !i.scrollbarYActive) {
          // useBothWheelAxes and only horizontal bar is active, so use both
          // wheel axes for horizontal bar
          if (deltaX) {
            element.scrollLeft = element.scrollLeft + (deltaX * i.settings.wheelSpeed)
          } else {
            element.scrollLeft = element.scrollLeft - (deltaY * i.settings.wheelSpeed)
          }
          shouldPrevent = true
        }

        updateGeometry(element)

        shouldPrevent = (shouldPrevent || shouldPreventDefault(deltaX, deltaY))
        if (shouldPrevent) {
          e.stopPropagation()
          e.preventDefault()
        }
      }

      if (typeof window.onwheel !== 'undefined') {
        i.event.bind(element, 'wheel', mousewheelHandler)
      } else if (typeof window.onmousewheel !== 'undefined') {
        i.event.bind(element, 'mousewheel', mousewheelHandler)
      }
    }

    module.exports = function (element) {
      var i = instances.get(element)
      bindMouseWheelHandler(element, i)
    }
  }, { '../../lib/helper': 6, '../instances': 18, '../update-geometry': 19 }],
  14: [function (require, module, exports) {
    /* Copyright (c) 2015 Hyunje Alex Jun and other contributors
 * Licensed under the MIT License
 */
    'use strict'

    var instances = require('../instances')
    var updateGeometry = require('../update-geometry')

    function bindNativeScrollHandler (element, i) {
      i.event.bind(element, 'scroll', function () {
        updateGeometry(element)
      })
    }

    module.exports = function (element) {
      var i = instances.get(element)
      bindNativeScrollHandler(element, i)
    }
  }, { '../instances': 18, '../update-geometry': 19 }],
  15: [function (require, module, exports) {
    /* Copyright (c) 2015 Hyunje Alex Jun and other contributors
 * Licensed under the MIT License
 */
    'use strict'

    var h = require('../../lib/helper')
    var instances = require('../instances')
    var updateGeometry = require('../update-geometry')

    function bindSelectionHandler (element, i) {
      function getRangeNode () {
        var selection = window.getSelection ? window.getSelection()
          : document.getSelection ? document.getSelection() : ''
        if (selection.toString().length === 0) {
          return null
        } else {
          return selection.getRangeAt(0).commonAncestorContainer
        }
      }

      var scrollingLoop = null
      var scrollDiff = { top: 0, left: 0 }
      function startScrolling () {
        if (!scrollingLoop) {
          scrollingLoop = setInterval(function () {
            if (!instances.get(element)) {
              clearInterval(scrollingLoop)
              return
            }

            element.scrollTop = element.scrollTop + scrollDiff.top
            element.scrollLeft = element.scrollLeft + scrollDiff.left
            updateGeometry(element)
          }, 50) // every .1 sec
        }
      }
      function stopScrolling () {
        if (scrollingLoop) {
          clearInterval(scrollingLoop)
          scrollingLoop = null
        }
        h.stopScrolling(element)
      }

      var isSelected = false
      i.event.bind(i.ownerDocument, 'selectionchange', function () {
        if (element.contains(getRangeNode())) {
          isSelected = true
        } else {
          isSelected = false
          stopScrolling()
        }
      })
      i.event.bind(window, 'mouseup', function () {
        if (isSelected) {
          isSelected = false
          stopScrolling()
        }
      })

      i.event.bind(window, 'mousemove', function (e) {
        if (isSelected) {
          var mousePosition = { x: e.pageX, y: e.pageY }
          var containerGeometry = {
            left: element.offsetLeft,
            right: element.offsetLeft + element.offsetWidth,
            top: element.offsetTop,
            bottom: element.offsetTop + element.offsetHeight
          }

          if (mousePosition.x < containerGeometry.left + 3) {
            scrollDiff.left = -5
            h.startScrolling(element, 'x')
          } else if (mousePosition.x > containerGeometry.right - 3) {
            scrollDiff.left = 5
            h.startScrolling(element, 'x')
          } else {
            scrollDiff.left = 0
          }

          if (mousePosition.y < containerGeometry.top + 3) {
            if (containerGeometry.top + 3 - mousePosition.y < 5) {
              scrollDiff.top = -5
            } else {
              scrollDiff.top = -20
            }
            h.startScrolling(element, 'y')
          } else if (mousePosition.y > containerGeometry.bottom - 3) {
            if (mousePosition.y - containerGeometry.bottom + 3 < 5) {
              scrollDiff.top = 5
            } else {
              scrollDiff.top = 20
            }
            h.startScrolling(element, 'y')
          } else {
            scrollDiff.top = 0
          }

          if (scrollDiff.top === 0 && scrollDiff.left === 0) {
            stopScrolling()
          } else {
            startScrolling()
          }
        }
      })
    }

    module.exports = function (element) {
      var i = instances.get(element)
      bindSelectionHandler(element, i)
    }
  }, { '../../lib/helper': 6, '../instances': 18, '../update-geometry': 19 }],
  16: [function (require, module, exports) {
    /* Copyright (c) 2015 Hyunje Alex Jun and other contributors
 * Licensed under the MIT License
 */
    'use strict'

    var instances = require('../instances')
    var updateGeometry = require('../update-geometry')

    function bindTouchHandler (element, i, supportsTouch, supportsIePointer) {
      function shouldPreventDefault (deltaX, deltaY) {
        var scrollTop = element.scrollTop
        var scrollLeft = element.scrollLeft
        var magnitudeX = Math.abs(deltaX)
        var magnitudeY = Math.abs(deltaY)

        if (magnitudeY > magnitudeX) {
          // user is perhaps trying to swipe up/down the page

          if (((deltaY < 0) && (scrollTop === i.contentHeight - i.containerHeight)) ||
          ((deltaY > 0) && (scrollTop === 0))) {
            return !i.settings.swipePropagation
          }
        } else if (magnitudeX > magnitudeY) {
          // user is perhaps trying to swipe left/right across the page

          if (((deltaX < 0) && (scrollLeft === i.contentWidth - i.containerWidth)) ||
          ((deltaX > 0) && (scrollLeft === 0))) {
            return !i.settings.swipePropagation
          }
        }

        return true
      }

      function applyTouchMove (differenceX, differenceY) {
        element.scrollTop = element.scrollTop - differenceY
        element.scrollLeft = element.scrollLeft - differenceX

        updateGeometry(element)
      }

      var startOffset = {}
      var startTime = 0
      var speed = {}
      var easingLoop = null
      var inGlobalTouch = false
      var inLocalTouch = false

      function globalTouchStart () {
        inGlobalTouch = true
      }
      function globalTouchEnd () {
        inGlobalTouch = false
      }

      function getTouch (e) {
        if (e.targetTouches) {
          return e.targetTouches[0]
        } else {
          // Maybe IE pointer
          return e
        }
      }
      function shouldHandle (e) {
        if (e.targetTouches && e.targetTouches.length === 1) {
          return true
        }
        if (e.pointerType && e.pointerType !== 'mouse' && e.pointerType !== e.MSPOINTER_TYPE_MOUSE) {
          return true
        }
        return false
      }
      function touchStart (e) {
        if (shouldHandle(e)) {
          inLocalTouch = true

          var touch = getTouch(e)

          startOffset.pageX = touch.pageX
          startOffset.pageY = touch.pageY

          startTime = (new Date()).getTime()

          if (easingLoop !== null) {
            clearInterval(easingLoop)
          }

          e.stopPropagation()
        }
      }
      function touchMove (e) {
        if (!inGlobalTouch && inLocalTouch && shouldHandle(e)) {
          var touch = getTouch(e)

          var currentOffset = { pageX: touch.pageX, pageY: touch.pageY }

          var differenceX = currentOffset.pageX - startOffset.pageX
          var differenceY = currentOffset.pageY - startOffset.pageY

          applyTouchMove(differenceX, differenceY)
          startOffset = currentOffset

          var currentTime = (new Date()).getTime()

          var timeGap = currentTime - startTime
          if (timeGap > 0) {
            speed.x = differenceX / timeGap
            speed.y = differenceY / timeGap
            startTime = currentTime
          }

          if (shouldPreventDefault(differenceX, differenceY)) {
            e.stopPropagation()
            e.preventDefault()
          }
        }
      }
      function touchEnd () {
        if (!inGlobalTouch && inLocalTouch) {
          inLocalTouch = false

          clearInterval(easingLoop)
          easingLoop = setInterval(function () {
            if (!instances.get(element)) {
              clearInterval(easingLoop)
              return
            }

            if (Math.abs(speed.x) < 0.01 && Math.abs(speed.y) < 0.01) {
              clearInterval(easingLoop)
              return
            }

            applyTouchMove(speed.x * 30, speed.y * 30)

            speed.x *= 0.8
            speed.y *= 0.8
          }, 10)
        }
      }

      if (supportsTouch) {
        i.event.bind(window, 'touchstart', globalTouchStart)
        i.event.bind(window, 'touchend', globalTouchEnd)
        i.event.bind(element, 'touchstart', touchStart)
        i.event.bind(element, 'touchmove', touchMove)
        i.event.bind(element, 'touchend', touchEnd)
      }

      if (supportsIePointer) {
        if (window.PointerEvent) {
          i.event.bind(window, 'pointerdown', globalTouchStart)
          i.event.bind(window, 'pointerup', globalTouchEnd)
          i.event.bind(element, 'pointerdown', touchStart)
          i.event.bind(element, 'pointermove', touchMove)
          i.event.bind(element, 'pointerup', touchEnd)
        } else if (window.MSPointerEvent) {
          i.event.bind(window, 'MSPointerDown', globalTouchStart)
          i.event.bind(window, 'MSPointerUp', globalTouchEnd)
          i.event.bind(element, 'MSPointerDown', touchStart)
          i.event.bind(element, 'MSPointerMove', touchMove)
          i.event.bind(element, 'MSPointerUp', touchEnd)
        }
      }
    }

    module.exports = function (element, supportsTouch, supportsIePointer) {
      var i = instances.get(element)
      bindTouchHandler(element, i, supportsTouch, supportsIePointer)
    }
  }, { '../instances': 18, '../update-geometry': 19 }],
  17: [function (require, module, exports) {
    /* Copyright (c) 2015 Hyunje Alex Jun and other contributors
 * Licensed under the MIT License
 */
    'use strict'

    var cls = require('../lib/class')
    var h = require('../lib/helper')
    var instances = require('./instances')
    var updateGeometry = require('./update-geometry')

    // Handlers
    var clickRailHandler = require('./handler/click-rail')
    var dragScrollbarHandler = require('./handler/drag-scrollbar')
    var keyboardHandler = require('./handler/keyboard')
    var mouseWheelHandler = require('./handler/mouse-wheel')
    var nativeScrollHandler = require('./handler/native-scroll')
    var selectionHandler = require('./handler/selection')
    var touchHandler = require('./handler/touch')

    module.exports = function (element, userSettings) {
      userSettings = typeof userSettings === 'object' ? userSettings : {}

      cls.add(element, 'ps-container')

      // Create a plugin instance.
      var i = instances.add(element)

      i.settings = h.extend(i.settings, userSettings)

      clickRailHandler(element)
      dragScrollbarHandler(element)
      mouseWheelHandler(element)
      nativeScrollHandler(element)
      selectionHandler(element)

      if (h.env.supportsTouch || h.env.supportsIePointer) {
        touchHandler(element, h.env.supportsTouch, h.env.supportsIePointer)
      }
      if (i.settings.useKeyboard) {
        keyboardHandler(element)
      }

      updateGeometry(element)
    }
  }, { '../lib/class': 2, '../lib/helper': 6, './handler/click-rail': 10, './handler/drag-scrollbar': 11, './handler/keyboard': 12, './handler/mouse-wheel': 13, './handler/native-scroll': 14, './handler/selection': 15, './handler/touch': 16, './instances': 18, './update-geometry': 19 }],
  18: [function (require, module, exports) {
    /* Copyright (c) 2015 Hyunje Alex Jun and other contributors
 * Licensed under the MIT License
 */
    'use strict'

    var d = require('../lib/dom')
    var defaultSettings = require('./default-setting')
    var EventManager = require('../lib/event-manager')
    var guid = require('../lib/guid')
    var h = require('../lib/helper')

    var instances = {}

    function Instance (element) {
      var i = this

      i.settings = h.clone(defaultSettings)
      i.containerWidth = null
      i.containerHeight = null
      i.contentWidth = null
      i.contentHeight = null

      i.isRtl = d.css(element, 'direction') === 'rtl'
      i.isNegativeScroll = (function () {
        var originalScrollLeft = element.scrollLeft
        var result = null
        element.scrollLeft = -1
        result = element.scrollLeft < 0
        element.scrollLeft = originalScrollLeft
        return result
      })()
      i.negativeScrollAdjustment = i.isNegativeScroll ? element.scrollWidth - element.clientWidth : 0
      i.event = new EventManager()
      i.ownerDocument = element.ownerDocument || document

      i.scrollbarXRail = d.appendTo(d.e('div', 'ps-scrollbar-x-rail'), element)
      i.scrollbarX = d.appendTo(d.e('div', 'ps-scrollbar-x'), i.scrollbarXRail)
      i.scrollbarXActive = null
      i.scrollbarXWidth = null
      i.scrollbarXLeft = null
      i.scrollbarXBottom = h.toInt(d.css(i.scrollbarXRail, 'bottom'))
      i.isScrollbarXUsingBottom = i.scrollbarXBottom === i.scrollbarXBottom // !isNaN
      i.scrollbarXTop = i.isScrollbarXUsingBottom ? null : h.toInt(d.css(i.scrollbarXRail, 'top'))
      i.railBorderXWidth = h.toInt(d.css(i.scrollbarXRail, 'borderLeftWidth')) + h.toInt(d.css(i.scrollbarXRail, 'borderRightWidth'))
      // Set rail to display:block to calculate margins
      d.css(i.scrollbarXRail, 'display', 'block')
      i.railXMarginWidth = h.toInt(d.css(i.scrollbarXRail, 'marginLeft')) + h.toInt(d.css(i.scrollbarXRail, 'marginRight'))
      d.css(i.scrollbarXRail, 'display', '')
      i.railXWidth = null
      i.railXRatio = null

      i.scrollbarYRail = d.appendTo(d.e('div', 'ps-scrollbar-y-rail'), element)
      i.scrollbarY = d.appendTo(d.e('div', 'ps-scrollbar-y'), i.scrollbarYRail)
      i.scrollbarYActive = null
      i.scrollbarYHeight = null
      i.scrollbarYTop = null
      i.scrollbarYRight = h.toInt(d.css(i.scrollbarYRail, 'right'))
      i.isScrollbarYUsingRight = i.scrollbarYRight === i.scrollbarYRight // !isNaN
      i.scrollbarYLeft = i.isScrollbarYUsingRight ? null : h.toInt(d.css(i.scrollbarYRail, 'left'))
      i.scrollbarYOuterWidth = i.isRtl ? h.outerWidth(i.scrollbarY) : null
      i.railBorderYWidth = h.toInt(d.css(i.scrollbarYRail, 'borderTopWidth')) + h.toInt(d.css(i.scrollbarYRail, 'borderBottomWidth'))
      d.css(i.scrollbarYRail, 'display', 'block')
      i.railYMarginHeight = h.toInt(d.css(i.scrollbarYRail, 'marginTop')) + h.toInt(d.css(i.scrollbarYRail, 'marginBottom'))
      d.css(i.scrollbarYRail, 'display', '')
      i.railYHeight = null
      i.railYRatio = null
    }

    function getId (element) {
      if (typeof element.dataset === 'undefined') {
        return element.getAttribute('data-ps-id')
      } else {
        return element.dataset.psId
      }
    }

    function setId (element, id) {
      if (typeof element.dataset === 'undefined') {
        element.setAttribute('data-ps-id', id)
      } else {
        element.dataset.psId = id
      }
    }

    function removeId (element) {
      if (typeof element.dataset === 'undefined') {
        element.removeAttribute('data-ps-id')
      } else {
        delete element.dataset.psId
      }
    }

    exports.add = function (element) {
      var newId = guid()
      setId(element, newId)
      instances[newId] = new Instance(element)
      return instances[newId]
    }

    exports.remove = function (element) {
      delete instances[getId(element)]
      removeId(element)
    }

    exports.get = function (element) {
      return instances[getId(element)]
    }
  }, { '../lib/dom': 3, '../lib/event-manager': 4, '../lib/guid': 5, '../lib/helper': 6, './default-setting': 8 }],
  19: [function (require, module, exports) {
    /* Copyright (c) 2015 Hyunje Alex Jun and other contributors
 * Licensed under the MIT License
 */
    'use strict'

    var cls = require('../lib/class')
    var d = require('../lib/dom')
    var h = require('../lib/helper')
    var instances = require('./instances')

    function getThumbSize (i, thumbSize) {
      if (i.settings.minScrollbarLength) {
        thumbSize = Math.max(thumbSize, i.settings.minScrollbarLength)
      }
      if (i.settings.maxScrollbarLength) {
        thumbSize = Math.min(thumbSize, i.settings.maxScrollbarLength)
      }
      return thumbSize
    }

    function updateCss (element, i) {
      var xRailOffset = { width: i.railXWidth }
      if (i.isRtl) {
        xRailOffset.left = i.negativeScrollAdjustment + element.scrollLeft + i.containerWidth - i.contentWidth
      } else {
        xRailOffset.left = element.scrollLeft
      }
      if (i.isScrollbarXUsingBottom) {
        xRailOffset.bottom = i.scrollbarXBottom - element.scrollTop
      } else {
        xRailOffset.top = i.scrollbarXTop + element.scrollTop
      }
      d.css(i.scrollbarXRail, xRailOffset)

      var yRailOffset = { top: element.scrollTop, height: i.railYHeight }
      if (i.isScrollbarYUsingRight) {
        if (i.isRtl) {
          yRailOffset.right = i.contentWidth - (i.negativeScrollAdjustment + element.scrollLeft) - i.scrollbarYRight - i.scrollbarYOuterWidth
        } else {
          yRailOffset.right = i.scrollbarYRight - element.scrollLeft
        }
      } else {
        if (i.isRtl) {
          yRailOffset.left = i.negativeScrollAdjustment + element.scrollLeft + i.containerWidth * 2 - i.contentWidth - i.scrollbarYLeft - i.scrollbarYOuterWidth
        } else {
          yRailOffset.left = i.scrollbarYLeft + element.scrollLeft
        }
      }
      d.css(i.scrollbarYRail, yRailOffset)

      d.css(i.scrollbarX, { left: i.scrollbarXLeft, width: i.scrollbarXWidth - i.railBorderXWidth })
      d.css(i.scrollbarY, { top: i.scrollbarYTop, height: i.scrollbarYHeight - i.railBorderYWidth })
    }

    module.exports = function (element) {
      var i = instances.get(element)

      i.containerWidth = element.clientWidth
      i.containerHeight = element.clientHeight
      i.contentWidth = element.scrollWidth
      i.contentHeight = element.scrollHeight

      if (!element.contains(i.scrollbarXRail)) {
        d.appendTo(i.scrollbarXRail, element)
      }
      if (!element.contains(i.scrollbarYRail)) {
        d.appendTo(i.scrollbarYRail, element)
      }

      if (!i.settings.suppressScrollX && i.containerWidth + i.settings.scrollXMarginOffset < i.contentWidth) {
        i.scrollbarXActive = true
        i.railXWidth = i.containerWidth - i.railXMarginWidth
        i.railXRatio = i.containerWidth / i.railXWidth
        i.scrollbarXWidth = getThumbSize(i, h.toInt(i.railXWidth * i.containerWidth / i.contentWidth))
        i.scrollbarXLeft = h.toInt((i.negativeScrollAdjustment + element.scrollLeft) * (i.railXWidth - i.scrollbarXWidth) / (i.contentWidth - i.containerWidth))
      } else {
        i.scrollbarXActive = false
        i.scrollbarXWidth = 0
        i.scrollbarXLeft = 0
        element.scrollLeft = 0
      }

      if (!i.settings.suppressScrollY && i.containerHeight + i.settings.scrollYMarginOffset < i.contentHeight) {
        i.scrollbarYActive = true
        i.railYHeight = i.containerHeight - i.railYMarginHeight
        i.railYRatio = i.containerHeight / i.railYHeight
        i.scrollbarYHeight = getThumbSize(i, h.toInt(i.railYHeight * i.containerHeight / i.contentHeight))
        i.scrollbarYTop = h.toInt(element.scrollTop * (i.railYHeight - i.scrollbarYHeight) / (i.contentHeight - i.containerHeight))
      } else {
        i.scrollbarYActive = false
        i.scrollbarYHeight = 0
        i.scrollbarYTop = 0
        element.scrollTop = 0
      }

      if (i.scrollbarXLeft >= i.railXWidth - i.scrollbarXWidth) {
        i.scrollbarXLeft = i.railXWidth - i.scrollbarXWidth
      }
      if (i.scrollbarYTop >= i.railYHeight - i.scrollbarYHeight) {
        i.scrollbarYTop = i.railYHeight - i.scrollbarYHeight
      }

      updateCss(element, i)

      cls[i.scrollbarXActive ? 'add' : 'remove'](element, 'ps-active-x')
      cls[i.scrollbarYActive ? 'add' : 'remove'](element, 'ps-active-y')
    }
  }, { '../lib/class': 2, '../lib/dom': 3, '../lib/helper': 6, './instances': 18 }],
  20: [function (require, module, exports) {
    /* Copyright (c) 2015 Hyunje Alex Jun and other contributors
 * Licensed under the MIT License
 */
    'use strict'

    var d = require('../lib/dom')
    var h = require('../lib/helper')
    var instances = require('./instances')
    var updateGeometry = require('./update-geometry')

    module.exports = function (element) {
      var i = instances.get(element)

      if (!i) {
        return
      }

      // Recalcuate negative scrollLeft adjustment
      i.negativeScrollAdjustment = i.isNegativeScroll ? element.scrollWidth - element.clientWidth : 0

      // Recalculate rail margins
      d.css(i.scrollbarXRail, 'display', 'block')
      d.css(i.scrollbarYRail, 'display', 'block')
      i.railXMarginWidth = h.toInt(d.css(i.scrollbarXRail, 'marginLeft')) + h.toInt(d.css(i.scrollbarXRail, 'marginRight'))
      i.railYMarginHeight = h.toInt(d.css(i.scrollbarYRail, 'marginTop')) + h.toInt(d.css(i.scrollbarYRail, 'marginBottom'))

      // Hide scrollbars not to affect scrollWidth and scrollHeight
      d.css(i.scrollbarXRail, 'display', 'none')
      d.css(i.scrollbarYRail, 'display', 'none')

      updateGeometry(element)

      d.css(i.scrollbarXRail, 'display', '')
      d.css(i.scrollbarYRail, 'display', '')
    }
  }, { '../lib/dom': 3, '../lib/helper': 6, './instances': 18, './update-geometry': 19 }]
}, {}, [1])
